/*
 * @Description: 
 * @version: 
 * @Author: cy
 * @Date: 2021-12-24 09:30:55
 * @LastEditors: cy
 * @LastEditTime: 2021-12-31 16:12:08
 */
// LeeCode: 2

// 步骤：  1） 新建一个空链表,输出的新链表
//         2）遍历被相加的两个链表，模拟相加操作，将个位数追加到新链表上，将十位数留到下一位去相加，等链表遍历完的时候新链表构建完成
function ListNode(val) {
    this.val = val;
    this.next = null;
}
const a = {val: 2};
const b = a.next = { val: 4 }
b.next = { val: 3 }

const c = { val: 5 }
const d = c.next = { val: 6 }
d.next = { val: 4 }
// 遍历链表
let p = a
function print(val) {
    while(val) {
        console.log(val.val);
        val = val.next;
    }
}
print(p)
print(c)
var addTwoNumbers = function(l1, l2) {
    // 新建空链表
    const l3 = new ListNode(0);
    let p1 = l1;
    let p2 = l2;
    let p3 = l3;
    // 留到下一轮要相加的那个数,比如在十位数相加得到10，它超出了9，进一，这个1代入到百位上
    let carry = 0;
    while(p1 || p2) {
        const v1 = p1 ? p1.val : 0;
        const v2 = p2 ? p2.val : 0;
        const val = v1 + v2 + carry;
        carry = Math.floor(val / 10);
        // 把个位上的数追加到新链表上
        p3.next = new ListNode(val % 10);
        // 把所有的指针移动一位
        if (p1) p1 = p1.next;
        if (p2) p2 = p2.next;
        p3 = p3.next;
    }
    // 若循环结束后还有进位数则再添加一个节点存
    if (carry) {
        p3.next = new ListNode(carry);
    }
    return l3.next;
}
console.log('------相加的结果------')
print(addTwoNumbers(p, c))

